/* name: pearl
 * author: 5ab
 * created at: 2024-07-01
 */
#include <iostream>
using namespace std;

#define all(x) (x).begin(), (x).end()
#define ssz(x) (int((x).size()))

auto chmax = [](auto& x, auto y) { if (x < y) x = y; };
auto chmin = [](auto& x, auto y) { if (y < x) x = y; };

using ll = long long;
const int M = 1e5, mod = 1e9 + 7;

char s[M + 1];
int d[M + 1];

ll qpow(ll bs, ll ix)
{
	ll mul = bs, ret = 1;
	while (ix)
	{
		if (ix & 1)
			ret = (ret * mul) % mod;
		mul = (mul * mul) % mod;
		ix >>= 1;
	}
	return ret;
}

signed main()
{
	freopen("pearl.in", "r", stdin);
	freopen("pearl.out", "w", stdout);
	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n, m, p;
	
	cin >> n >> m >> p >> s;
	int x = 0, y = 0, cx = m;
	x += p / 2, y += (p - 1) / 2;
	x += (n - p + 1) / 2, y += (n - p) / 2;
	
	if (!((n & 1) && (p & 1)))
	{
		for (int i = 0; i <= m; i++)
			if (s[i] == '1')
			{
				cx = i;
				break;
			}
	}
	
	// cerr << x << " " << y << " " << cx << endl;
	for (int i = 0, c = 0; i <= m; i++)
	{
		d[i] = c = (c + qpow(2, ll(m) * (x - 1) + i + ll(m - i - 1) * y) * (qpow(2, y) - (i != m) + mod)) % mod;
		// cerr << c << " \n"[i == m];
	}
	
	int sm = 0;
	for (int i = cx; i <= m; i++)
		sm = ((1ll + (i != m)) * sm + d[i]) % mod;
	sm = 1ll * sm * qpow(qpow(2, m - cx), mod - 2) % mod;
	for (int i = cx; i <= m; i++)
		d[i] = sm;
	
	// for (int i = 0; i <= m; i++)
	// 	cerr << d[i] << " \n"[i == m];
	
	int ans = 0;
	for (int i = 0; i < m; i++)
		ans = (ans + ll(qpow(2, m) - qpow(2, i) + mod) * (d[i] - (i == 0 ? 0 : d[i - 1]) + mod) % mod * qpow(2, m - i - 1)) % mod;
	cout << ans << endl;
	
	return 0;
}
// started coding at: 07-01 11:07:15